package com.kamistoat.meimeistore.seckill.service;

import com.kamistoat.common.To.SecKillTo.SecKillProductCacheTo;
import com.kamistoat.common.To.SecKillTo.SecKillProductTo;
import com.kamistoat.common.utils.R;

import java.util.List;

public interface SecKillService {
    /**
     * 上架未来三天的秒杀商品
     */
    void upload3DaySecKillSku();

    /**
     * 删除已经过期一天的活动
     */
    void deleteOut1DaySecKill();

    /**
     * 获取当前时间秒杀活动的商品信息，如果当前时间段没有秒杀活动，返回下一场最近的秒杀活动
     *
     * @return
     */
    List<SecKillProductCacheTo> getCurrentSecKillSession();

    /**
     * 获取未来所有的秒杀场次的商品信息
     * 外层List的每一个元素是一场秒杀
     * 每层List的每一个元素是这场秒杀的商品信息
     * @return
     */
    List<List<SecKillProductCacheTo>> getFutureSecKillSessionList();

    /**
     * 商品详情页，远程该商品未来三天是否有秒杀活动
     *
     * @param skuId skuId
     * @return 类间传输To
     */
    SecKillProductCacheTo getSkuSecKill(Long skuId);

    /**
     * 前端秒杀商品
     * @param sessionProId 场次-商品关联id。全局唯一
     * @param randomCode   秒杀商品随机码
     * @param skuId        商品skuId，用于和场次-商品关联Id做联合检查
     * @param num          要购买多少件商品
     * @return R对象。如果成功就把订单号放进去
     */
    R secKillPro(Long sessionProId, String randomCode, Long skuId, Integer num);

    /**
     * 删除redis中已经缓存的原秒杀
     * 并重新检查相同id是否是1天以内的秒杀，如果是，立刻上架
     */
    void delete_ReUp_RedisSessions(List<String> redisSessionKeyList);

    /**
     * 前端秒杀。第二种实现，和现有支付框架整合
     * @param sessionProId 场次-商品关联id。全局唯一
     * @param randomCode   秒杀商品随机码
     * @param skuId        商品skuId，用于和场次-商品关联Id做联合检查
     * @param num          要购买多少件商品
     * @return R对象。如果成功就把订单号放进去
     */
    R secKillProSec(Long sessionProId, String randomCode, Long skuId, Integer num);
}
